package ar.unsam.tp1.programa

import java.util.ArrayList
import java.util.Comparator
import java.util.List

class Partido {
	public List<Jugador> jugadoresCandidatos = new ArrayList<Jugador>
	public List<Condicion> caracteristicasDelPartido = new ArrayList<Condicion>
	public List<Jugador> jugadoresQueJueganSeguro = new ArrayList<Jugador>

	@Property public int modo

	def void definirJugadores() {
		ordenarLista()
		verificarQuienJuega()
	}

	def void ordenarLista() {
		jugadoresCandidatos.sortInplace(new JugadorComparator())
	}

	def alta(Jugador jugador) {
		this.jugadoresCandidatos.add(jugador)
	}

	def baja(Jugador jugador) {
		this.jugadoresCandidatos.remove(jugador)
	}

	def setCaracteristica(Condicion condicion) {
		this.caracteristicasDelPartido.add(condicion)
	}

	def String mostrarLista() {
		jugadoresCandidatos.toArray.toString
	}

	def void verificarQuienJuega() {
		for (Jugador jugador : jugadoresCandidatos) {
			if (!(jugador.tipoDeInscripcion instanceof Condicional)) {
				agregarJugadorSeguro(jugador)
			} else {
				verificarYcompararCondicionalDelJugador(jugador)
			}
		}
	}

	def void agregarJugadorSeguro(Jugador jugadorSeguro) {
		if (jugadoresQueJueganSeguro.size() < 10) {
			jugadoresQueJueganSeguro.add(jugadorSeguro)
		}
	}

	def void verificarYcompararCondicionalDelJugador(Jugador jugadorCondicional) {
		for (Condicion caracteristica : caracteristicasDelPartido) {
			if (caracteristica.compararCon(jugadorCondicional.tipoDeInscripcion.condicion)) {
				agregarJugadorSeguro(jugadorCondicional)
			}
		}
	}
}

class JugadorComparator implements Comparator<Jugador> {
	override int compare(Jugador jugador1, Jugador jugador2) {
		var j1 = jugador1.tipoDeInscripcion.prioridad
		var j2 = jugador2.tipoDeInscripcion.prioridad
		Integer::compare(j1, j2)
	}
}
